package servlet;

import controller.ControllerRicercaLocal;
import eccezioni.CampoErratoException;
import eccezioni.FacebookNotLinkedException;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import statefulSB.UtenteLoggatoLocal;
import utilities.AnnuncioConDistanza;
import utilities.FbUtilities;
import utilities.Utilities;

/**
 * Servlet che permette la ricerca rapida o avanzata tra gli annunci.
 * @author Ale
 */
public class RicercaServlet extends HttpServlet {

    @EJB
    private ControllerRicercaLocal controllerRicerca;

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter("action");

        if (action == null) {
            Utilities.errore("Nessuna action specificata alla RicercaServlet", request, response);
        } else if (action.equals("mostraRicercaAvanzata")) {
            mostraRicercaAvanzata(request, response);
        } else if (action.equals("mostraRicercaPopup")) { //richiesta ajax
            mostraRicercaPopup(request, response);
        } else if (action.equals("cercaAnnuncio")) {
            cercaAnnuncio(request, response);
        } else if (action.equals("ricercaAvanzataAnnuncio")) {
            ricercaAvanzataAnnuncio(request, response);
        }
    }

    private void mostraRicercaAvanzata(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Utilities.forward("/ricercaAvanzata.jsp", request, response);
    }

    private void mostraRicercaPopup(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Utilities.forward("/WEB-INF/jspf/ricercaSemplice.jsp", request, response);
    }

    private void cercaAnnuncio(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String url = request.getParameter("urlSito");
        String vicinoA = request.getParameter("indirizzo");

        List<AnnuncioConDistanza> annunci;
        try {
            annunci = controllerRicerca.cerca(Utilities.getUtenteLoggato(request), url, vicinoA);
            request.setAttribute("annunci", annunci);
            request.setAttribute("vicinoA", vicinoA);
            Utilities.forward("/risultatiRicercaSemplice.jsp", request, response);
        } catch (CampoErratoException ex) {
            Utilities.errore(ex.getMessage(), request, response);
        }

    }

    private void ricercaAvanzataAnnuncio(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //recupero i parametri della ricerca
        String url = request.getParameter("urlSito");
        String ordine = request.getParameter("ordine");
        String chiusura = request.getParameter("chiusura");
        String vicinoA = request.getParameter("indirizzo");
        boolean chiusi = request.getParameter("chiusi") != null; //anche annunci chiusi?

        /*
         * creatoDa ha valori: 
         *  - chiunque 
         *  - minFeed: il valore minimo del feedback è nel parametro star 
         *  - amicoFb 
         *  - amicoFbConFeed: il valore minimo del feedback è nel parametro starFb 
         *  - persona: nome e cognome nei parametri nomeCr, cognomeCr
         */
        String creatoDa = request.getParameter("creatoDa");

        //stelline, vanno da 1 a 5
        String star = request.getParameter("star");
        String starfb = request.getParameter("starfb");
        if (star == null) {
            star = "0";
        }
        if (starfb == null) {
            starfb = "0";
        }

        String nomeCr = request.getParameter("nomeCr");
        String cognomeCr = request.getParameter("cognomeCr");

        List<AnnuncioConDistanza> annunci = new LinkedList<AnnuncioConDistanza>();
        UtenteLoggatoLocal ull = Utilities.getUtenteLoggatoLocal(request);

        try {
            if (creatoDa.equals("chiunque")) {
                annunci = controllerRicerca.cerca(ull.getUtente(), url, chiusura, ordine, vicinoA, chiusi);
            } else if (creatoDa.equals("minFeed")) {
                annunci = controllerRicerca.cerca(ull.getUtente(), url, chiusura, ordine, vicinoA, chiusi, Integer.parseInt(star));
            } else if (creatoDa.equals("amicoFb")) {
                annunci = controllerRicerca.cerca(ull.getUtente(), url, chiusura, ordine, vicinoA, chiusi);
                try {
                    annunci = FbUtilities.isFriendOf(ull, annunci);
                } catch (FacebookNotLinkedException ex) {
                    Utilities.errore("Non sei collegato a facebook.", request, response);

                }
            } else if (creatoDa.equals("amicoFbConFeed")) {
                annunci = controllerRicerca.cerca(ull.getUtente(), url, chiusura, ordine, vicinoA, chiusi, Integer.parseInt(starfb));
                try {
                    annunci = FbUtilities.isFriendOf(ull, annunci);
                } catch (FacebookNotLinkedException ex) {
                    Utilities.errore("Non sei collegato a facebook.", request, response);
                }
            } else if (creatoDa.equals("persona")) {
                annunci = controllerRicerca.cerca(ull.getUtente(), url, chiusura, ordine, vicinoA, chiusi, nomeCr, cognomeCr);
            }
        } catch (CampoErratoException cee) {
            request.setAttribute("errore", cee.getMessage());
        }

        request.setAttribute("annunci", annunci);
        request.setAttribute("vicinoA", vicinoA);
        Utilities.forward("/ricercaAvanzata.jsp", request, response);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
    
}
